package com.cskaoyan.javase.oop3._3inner._3loacl._0introduction;

/**
 * 局部内部类,它其实就是定义在局部位置的一个内部类,可以将它近似的看成作用域内的局部变量,局部内部类就会被作用域限制作用范围.
 *
 * 局部内部类的特点,主要从以下几个角度分析：
 * 1. 访问权限修饰符
 *      不需要访问权限修饰符,已经被作用域限制死了作用范围
 *      而且也不能加static修饰
 *
 * 2. 成员特点
 *      在具体测试局部内部类的成员特点之前,咱们要明确以下三点:
 *      1.局部内部类仅在作用域内生效,这是一种比成员内部类更加极致的封装思想体现,仅在装局部内部类的那个方法中可以访问这个类,其余地方一概不能.
 *      2.局部内部类想要创建对象,必须在作用域内部创建,否者就无法创建了.
 *          局部内部类和成员内部类具有相似的特点,它们都没有静态声明,触发类加载必须依赖于创建它的对象
 *          我们以方法中的局部内部类为例子:
 *              1.在成员方法中的局部内部类
 *                  一旦创建局部内部类对象,会自动去持有外围类对象的引用,这就很像成员内部类
 *                  这时,局部内部类对象就可以随意访问外围类对象中的成员了.
 *
 *              2.在静态成员方法中的局部内部类
 *                  局部内部类对象不会强制持有外围类对象,静态方法中没有this指向当前对象
 *                  所以静态成员方法中局部内部类不会持有外围类对象的引用
 *                  --->
 *                  所以这时想要访问外围类成员,就必须自己new一个
 *
 *     3.局部内部类会显著增加代码层级,降低可读性,所以除非是真有需求,不然不要滥用.
 *
 *  局部内部类的成员特点和成员内部类一模一样,没有区别,就是没有静态声明
 *
 * 3. 继承和实现
 *      局部内部类主要的作用就是继承或者实现一个外部类和接口
 *      具体的使用场景,我们待会讲
 *
 * @since 10:53
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        /*EnclosedClazz ec = new EnclosedClazz();
        ec.test();
        System.out.println("hello");*/
        EnclosedClazz.testStatic();
    }
}

class EnclosedClazz {

    public void test() {
        int a = 10;
        // 定义局部内部类
        class Inner extends Demo {
            static final int a = 10;
            public void test(){

            }
            public Inner() {
            }
            {}
            // static {}
        }
        Inner in = new Inner();
        System.out.println("hello");
    }

    public static void testStatic(){
        int a = 10;
        // 定义局部内部类
        class Inner {
        }
        Inner in = new Inner();
        System.out.println("hello");
    }
}